import java.util.Scanner;

public class Solution {
    public static void main1(String[] args) {
        /**
         * 找出字符串中所有的回文子序列个数
         * 状态表示：
         *  dp[i][j]表示以i下标开始，以j下标结尾的所有所有子序列中，回文子序列的个数，并规定i<=j
         * 状态转移方程：
         *  if(i == j) {
         *      dp[i][j] = 1;
         *  } else if(i + 1 == j) {
         *      dp[i][j] = 2;
         *      if(chars[i] == chars[j]) {
         *          dp[i][j] += 1;
         *      }
         *  } else if(i + 1 < j) {
         *      dp[i][j] = dp[i][j-1] + dp[i+1][j] - dp[i+1][j-1];
         *      if(chars[i] == chars[j]) {
         *          dp[i][j] += 1 + dp[i+1][j-1];
         *      }
         *  }
         * 初始化：
         *  无需初始化
         * 填表顺序：
         *  从下到上，从左到右
         * */
        Scanner input = new Scanner(System.in);

        // 1 接收输入
        int n = input.nextInt();
        String s = input.next();
        char[] chars = s.toCharArray();
        int MOD = 998244353;

        // 2 创建状态表
        long[][] dp = new long[n][n];

        // 3 初始化（无需初始化）

        // 4 填表 + 状态转移方程
        for(int i = n-1; i >= 0; i--) {
            for(int j = i; j < n; j++) {
                if(i == j) {
                   dp[i][j] = 1;
                } else if(i + 1 == j) {
                   dp[i][j] = 2;
                   if(chars[i] == chars[j]) {
                       dp[i][j] += 1;
                   }
                } else if(i + 1 < j) {
                   // -若是此处代码结果为负数，那么取模后依旧为负数，会污染后续数据，因此需要+MOD
                   dp[i][j] = (dp[i][j-1] + dp[i+1][j] - dp[i+1][j-1] + MOD) % MOD;
                   if(chars[i] == chars[j]) {
                       dp[i][j] = (dp[i][j] + 1 + dp[i+1][j-1]) % MOD;
                   }
                }
                dp[i][j] %= MOD;
            }
        }

        // 5 返回值
        System.out.println(dp[0][n-1]);;
    }

    
}
